<!DOCTYPE html>
<html lang="es">
  <head>
    <meta charset="utf-8">
    <meta content="App Inventor para Android" name="description">
    <meta content="Android, Blocks App Inventor, Mobile, Phone, IDE" name="keywords">
    <title>
      No Text While Driving (Sin mensajes mientras conduzco) - App Inventor para Android
    </title>
    <link href="../../../static/images/appinventor-16.png" rel="SHORTCUT ICON" type="image/ico">
    <link href="../../../static/images/appinventor-16.png" rel="icon" type="image/png">
    <link href="../../../static/css/appinventor.css" rel="stylesheet" type="text/css">
<!-- ADD Google Analytics here -->
<!-- END Google Analytics here -->
    <style type="text/css">
img.c4 {border-width:0}
    h2.c3 {font-weight: bold}
    img.c2 {margin-left: 20px;}
    div.c1 {clear:both;}
    </style>
  </head>
  <body>
    <div id="aiac">
      <div class="main-container">
        <div class="header">
          <div class="header-title">
            <a href="../../../about/index.html"><img alt="" src="../../../static/images/appinventor_logo.gif"></a>
          </div>
            <div class="header-search">
<!-- ADD Google Custom Search -->
<!-- END Google Custom Search -->
              <div class="header-search-query">
              </div>
              <div class="header-search-button">
              </div>
            </div>
          <div class="header-login">
            <div class="header-login-greeting">
              Aprende acerca de App Inventor
            </div>
          </div>
        </div>
        <div class="customhr customhr-green"></div>
<!-- ADD Google Search Results -->
<div id="cse" style="width:100%;height:0;"></div>
<!-- END Google Search Results -->
        <div id="navigation">
          <div id="navigation-links">
            <div class="navigation-link-option" id="navigation-link-home">
              <a href="../../../about/index.html">Acerca de</a>
            </div>
            <div class="navigation-link-option navigation-link-active" id="navigation-link-learn">
              <a href="../../../learn/index.html">Aprende</a>
            </div>
            <div class="navigation-link-option" id="navigation-link-forum">
              <a href="../../../forum/index.html">Foro</a>
            </div>
            <div class="navigation-link-option" id="navigation-link-myappinventor">
              <a href="">Mis Proyectos</a><div>(próximamente)</div>
            </div>
          </div>
          <div id="navigation-breadcrumb">
            <a href="../../../learn/index.html">Aprende</a> &gt; <a href="../../../learn/tutorials/index.html">Tutoriales</a> &gt; No Text While Driving (Sin mensajes mientras conduzco) &gt;
          </div>
          <div class="c1"></div>
        </div>
        <div class="customhr customhr-gray"></div>
        <div class="content">
          <div class="content-body">
            <div class="learn-page">
              <h1>
                Sin mensajes mientras conduzco
              </h1>
              <div class="imagecontainer">
                <img align="right" alt="" border="0" class="c2" src="NoTextWhileDrivingAssets/emulator.png">
              </div>
              <p>
                Este tutorial demuestra como una aplicación puede responder automáticamente a los mensajes de texto. Crearás una aplicación que devuelve una respuesta cuando se recibe un mensaje de texto. La idea para la aplicación procede del estudiante Daniel Finnegan de la Universidad de San Francisco.<br>
              </p>
              <p>
                Para realizar este tutorial se supone que ya estas familiarizado con los conceptos básicos de App Inventor -- el uso del Diseñador de componentes para construir una interfaz de usuario, y el uso del Editor de bloques para especificar controladores de evento. Intenta realizar alguno de los <a href="../../../learn/tutorials/index.html">tutoriales basicos</a> antes de continuar.
              </p>
              <h2>
                Primeros pasos
              </h2>
              <p>
                Conéctate al sitio web de App Inventor  y comienza un nuevo proyecto. Nómbralo  NoTextWhileDriving, y también el <span class="ButtonText">Title</span> (título) de la pantalla a NoTextWhileDriving. Abre el editor de bloques y conéctalo al teléfono.
              </p>
              <h2>
                Introducción
              </h2>
              <p>
                Diseñarás la aplicación para que envíe una respuesta para cualquier mensaje recibido. También permitirás al usuario personalizar la respuesta enviada.
              </p>
              <p>
                Este tutorial introduce los siguientes conceptos de App Inventor:<br>
              </p>
              <ul>
                <li>El componente <span class="ButtonText">Texting</span> para enviar textos y procesar los textos recibidos.
                </li>
                <li>El componente base de datos <span class="ButtonText">TinyDB</span> para guardar el mensaje personalizado incluso cuando se cierra la aplicación.<br>
                </li>
              </ul>
              <h2>
                Prepara los componentes <br>
              </h2>
              <p>
                La interfaz de usuario para NoTextWhileDriving es simple: tiene una caja de texto para el mensaje de respuesta y un botón para enviar los cambios en el mensaje. También necesitarás un componente <span class="ButtonText">Texting</span> y un componente <span class="ButtonText">TinyDB</span>, los cuales aparecerán en el área de componentes "no visuales". Mas abajo hay una tabla con instrucciones detalladas para el diseño de los componentes, pero puedes también construirla a partir la la siguiente imagen de como deberían quedar:
              </p>
              <div class="imagecontainer">
                <img alt="" src="NoTextWhileDrivingAssets/NoTextDesigner.png" width="956">
              </div>
              <p>
                Los componentes que se muestran a continuación son los usados para crear la pantalla del diseñador mostrada mas arriba. Arrastra cada componente desde la <span class="ButtonText">Paleta</span> dentro del  <span class="ButtonText">Viewer</span> y nómbralos como se especifica a continuación:
              </p>
              <div class="advtutorial">
                <table>
                  <tbody>
                    <tr>
                      <td class="tbl-header">
                        Tipo de componente
                      </td>
                      <td class="tbl-header">
                        Grupo de la paleta
                      </td>
                      <td class="tbl-header">
                        Como lo llamarás
                      </td>
                      <td class="tbl-header">
                        Propósito del componente
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText">Label</span>
                      </td>
                      <td>                        
                        Basic                      
                      </td>
                      <td>
                        <span class="ButtonText">PromptLabel</span>
                      </td>
                      <td>
                        Informa al usuario sobre el funcionamiento de la aplicación
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText">TextBox</span>
                      </td>
                      <td>                        
                        Basic                      
                      </td>
                      <td>
                        <span class="ButtonText">MessageTextbox</span>
                      </td>
                      <td>
                        El usuario introducirá su respuesta personalizada aquí<br>
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText">Button</span>
                      </td>
                      <td>                        
                        Basic<br>
                      </td>
                      <td>
                        <span class="ButtonText">SubmitResponseButton</span>
                      </td>
                      <td>
                        El usuario hace clic aquí para enviar la respuesta a la base de datos
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText">Texting</span>
                      </td>
                      <td>                        
                        Social                      
                      </td>
                      <td>
                        <span class="ButtonText">Texting1</span>
                      </td>
                      <td>
                        El componente que procesará los textos
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText">TinyDB</span>
                      </td>
                      <td>                        
                        Basic                      
                      </td>
                      <td>
                        <span class="ButtonText">TinyDB1</span>
                      </td>
                      <td>
                        El componente que almacenará la respuesta en la base de datos
                      </td>
                    </tr>
                  </tbody>
                </table>
              </div>
              <p>
                Ajusta las propiedades de los componentes del siguiente modo:
              </p>
              <ul>
                <li>Cambia la propiedad <span class="ButtonText">Text</span> de <span class="ButtonText">PromptLabel</span> a "The text below will be sent in response to all texts while this app is running." (El texto a continuación se enviará como respuesta a todos los mensajes mientras la aplicación esté funcionando)
                </li>
                <li>Cambia la propiedad <span class="ButtonText">Text</span> de <span class="ButtonText">MessageTextbox</span> a "I'm driving right now, I'll contact you shortly". (Estoy conduciendo, te llamaré en breve)
                </li>
                <li>Cambia la propiedad <span class="ButtonText">Text</span> de <span class="ButtonText">SubmitResponseButton</span> a <span class="ButtonText">"Modify Response"</span>. (Modificar la respuesta)
                </li>
              </ul>
              <h2>
                Añade comportamientos a los componentes<br>
              </h2>
              <p>
                NoTextWhileDriving tiene los siguientes comportamientos:
              </p>
              <p>
                1. Cuando se recibe un mensaje, el texto introducido en <span class="ButtonText">MessageTextbox</span> se envía como mensaje de texto en respuesta al remitente.
              </p>
              <p>
                2. Cuando el usuario modifica el mensaje personalizado en <span class="ButtonText">MessageTextbox</span> y hace clic en <span class="ButtonText">SubmitResponseButton</span>, el nuevo mensaje se guarda de forma persistente en la base de datos del teléfono.
              </p>
              <p>
                3. Cuando se inicia la aplicación, el mensaje personalizado se carga desde la base de datos a <span class="ButtonText">MessageTextbox</span>.<br>
              </p>
              <h2>
                <strong>Respondiendo a un mensaje de texto</strong><br>
              </h2>
              <p>
                Cuando se recibe un mensaje en el teléfono, el evento <span class="ButtonText">Texting.MessageReceived</span> es iniciado. Tu aplicación debe manejar este evento ajustando las propiedades <span class="ButtonText">PhoneNumber</span> y <span class="ButtonText">Message</span> del componente <span class="ButtonText">Texting</span> apropiadamente y enviar texto de respuesta.<br>
              </p>
              <p>
                Necesitarás los siguientes bloques:<br>
              </p>
              <div class="advtutorial">
                <table>
                  <tbody>
                    <tr>
                      <td class="tbl-header">
                        Tipo de bloque
                      </td>
                      <td class="tbl-header">
                        Cajón
                      </td>
                      <td class="tbl-header">
                        Propósito
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText">Texting1.MessageReceived</span>
                      </td>
                      <td>                        
                        Texting1                      
                      </td>
                      <td>
                        el controlador de evento que se activa cuando se recibe un mensaje de texto
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText">set Texting1.PhoneNumber to</span>
                      </td>
                      <td>                        
                        Texting1<br>
                      </td>
                      <td>
                        Ajusta la propiedad <span class="ButtonText">PhoneNumber</span> antes de enviar.<br>
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText">value number</span>
                      </td>
                      <td>                        
                        My Definitions                      
                      </td>
                      <td>
                        este es el número de teléfono de la persona que envió el mensaje
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText">set Texting1.Message to</span><br>
                      </td>
                      <td>                        
                        Texting1                      
                      </td>
                      <td>
                        ajusta la propiedad <span class="ButtonText">Message</span> antes de enviar<br>
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText">MessageText.Text</span>
                      </td>
                      <td>                        
                        MessageText                      
                      </td>
                      <td>
                        Es el mensaje que el usuario ha introducido. 
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText">Texting1.SendMessage</span><br>
                      </td>
                      <td>                        
                        Texting<br>
                      </td>
                      <td>
                        Envía el mensaje.<br>
                      </td>
                    </tr>
                  </tbody>
                </table>
              </div>
              <p>
                Los bloques deben quedar así:
              </p>
              <div class="imagecontainer">
                <img alt="" height="212" src="NoTextWhileDrivingAssets/response1.png" width="455">
              </div>
              <h2>
                Como trabajan los bloques
              </h2>
              <p>
                Cuando el teléfono recibe cualquier mensaje, el evento <span class="ButtonText">Texting1.MessageReceived</span> es activado. El número de teléfono del remitente está en el argumento <span class="ButtonText">number</span>, y el mensaje del remitente en el argumento <span class="ButtonText">messageText</span>.
              </p>
              <p>
                En respuesta, la aplicación envía un mensaje de texto al remitente. Para enviar un mensaje, la aplicación ajusta las dos propiedades clave del componente <span class="ButtonText">Texting</span>: la propiedad <span class="ButtonText">PhoneNumber</span> y la propiedad <span class="ButtonText">Message</span>. <span class="ButtonText">Texting.PhoneNumber</span> se ajusta al número del remitente, y <span class="ButtonText">Texting.Message</span> se ajusta al mensaje de <span class="ButtonText">MessagetextBox</span>-- este puede ser, "I'm driving right now, I'll contact you shortly.", (Estoy conduciendo, te llamaré en breve) por defecto, o el usuario también podrá modificarlo. Una vez que estas propiedades están ajustadas, se llama a <span class="ButtonText">Texting1.SendMessage</span> para enviar el mensaje de respuesta.
              </p>
              <blockquote class="testing">
                <strong>Prueba el comportamiento.</strong> Necesitaras un segundo teléfono para probar este comportamiento. Desde el segundo teléfono, envía un mensaje de texto al teléfono que está ejecutando la aplicación. ¿Recibe el segundo teléfono el mensaje de respuesta? Si esto funciona, prueba a modificar el mensaje de respuesta y enviar otro mensaje desde el segundo teléfono. ¿Se ha enviado la nueva respuesta?<br>
              </blockquote>
              <h2 class="c3">
                Almacenando la respuesta personalizada
              </h2>
              <p>
                Hasta ahora  la aplicación funciona, pero si  la cierras y la vuelves a abrir el mensaje que has personalizado se habrá perdido. Para hacer las cosas de un modo mas conveniente, almacena la respuesta personalizada que el usuario ha introducido en una base de datos usando el componente <span class="ButtonText">TinyDB</span>.
              </p>
              <p>
                <span class="ButtonText">TinyDB</span> te proporciona  dos bloque: <span class="ButtonText">StoreValue</span> y <span class="ButtonText">GetValue</span>. De esta forma te permite almacenar y etiquetar una pieza de información, que mas tarde podrás recuperar.
              </p>
              <p>
                Necesitarás los siguientes bloques para almacenar la respuesta almacenada:<br>
              </p>
              <div class="advtutorial">
                <table>
                  <tbody>
                    <tr>
                      <td class="tbl-header">
                        Tipo de bloque
                      </td>
                      <td class="tbl-header">
                        Cajón
                      </td>
                      <td class="tbl-header">
                        Propósito
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText">SubmitResponseButton.Click</span>
                      </td>
                      <td>                        
                        SubmitResponseButton                      
                      </td>
                      <td>
                        El usuario hace clic en este botón para guardar el mensaje de respuesta
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText"> TinyDB1.StoreValue</span><br>
                      </td>
                      <td>                        
                        TinyDB1<br>
                      </td>
                      <td>
                        almacena el mensaje de respuesta en la base de datos del teléfono<br>
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText">text ("responseMessage")</span>
                      </td>
                      <td>                        
                        Text                      
                      </td>
                      <td>
                        es usado como etiqueta para los datos
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText">MessageTextbox.Text</span>
                      </td>
                      <td>                        
                        MessageTextbox                      
                      </td>
                      <td>
                        el mensaje de respuesta introducido por el usuario está aquí<br>
                      </td>
                    </tr>
                  </tbody>
                </table>
              </div>
              <p>
                Los bloques deben quedar así:
              </p>
              <div class="imagecontainer">
                <img alt="" height="143" src="NoTextWhileDrivingAssets/storeValue.png" width="452">
              </div>
              <h2>
                Como trabajan los bloques
              </h2>
              <p>
                Cuando el usuario hace clic en <span class="ButtonText">SubmitResponseButton</span>, la aplicación almacena la respuesta introducida en la base de datos. El texto  "responseMessage" es usado como etiqueta para identificar específicamente la información -- mas tarde usarás esa etiqueta para  recuperar el mensaje desde la base de datos.
              </p>
              <h2>
                Recuperando el mensaje de respuesta almacenado<br>
              </h2>
              <p>
                Programa el controlador de evento <span class="ButtonText">Screen1.Initialize</span> para que la respuesta personalizada que se ha almacenado sea recuperada desde la base de datos y colocada en <span class="ButtonText">MessageTextbox</span>. Comprueba los datos recuperados para asegurarte que contienen "algo" -- después de todo, la primera vez que se use la aplicación, la base de datos no tendrá ningún mensaje guardado. Si hay un mensaje guardado, colócalo en <span class="ButtonText">MessageTextbox</span> para que el usuario pueda verlo y que pueda ser usado para responder a los mensajes entrantes.
              </p>
              <p>
                Necesitarás los siguientes bloques:
              </p>
              <div class="advtutorial">
                <table>
                  <tbody>
                    <tr>
                      <td class="tbl-header">
                        Tipo de bloque
                      </td>
                      <td class="tbl-header">
                        Cajón
                      </td>
                      <td class="tbl-header">
                        Propósito
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText">def variable</span> ("response")<br>
                      </td>
                      <td>                        
                        Definitions<br>
                      </td>
                      <td>
                        Una variable temporal para almacenar los datos recuperados<br>
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText">text (vacio)</span>
                      </td>
                      <td>                        
                        Text                      
                      </td>
                      <td>
                        El valor inicial de la variable puede ser cualquier cosa
                      </td>
                    </tr>
                    <tr>
                      <td class="ButtonText">                        
                        Screen1.Initialize                      
                      </td>
                      <td>                        
                        Screen1                      
                      </td>
                      <td>
                        Este es activado cuando se inicia la aplicación
                      </td>
                    </tr>
                    <tr>
                      <td class="ButtonText">                        
                        set response to                      
                      </td>
                      <td>                        
                        My Definitions                      
                      </td>
                      <td>
                        cambiaras la variable al valor recuperado de la base de datos
                      </td>
                    </tr>
                    <tr>
                      <td class="ButtonText">                        
                        TinyDB1.GetValue                      
                      </td>
                      <td>                        
                        TinyDB1                      
                      </td>
                      <td>
                        toma la respuesta de texto almacenada en la base de datos
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText">text</span> ("responseMessage")                      
                      </td>
                      <td>                        
                        Text                      
                      </td>
                      <td>
                        colócalo en la ranura tag de <span class="ButtonText">GetValue</span>, asegurate de que el texto es el mismo que se usó en <span class="ButtonText">StoreValue above</span>
                      </td>
                    </tr>
                    <tr>
                      <td class="ButtonText">                        
                        if test                      
                      </td>
                      <td>                        
                        Control                      
                      </td>
                      <td>
                        para preguntar si el valor recuperado contiene algún texto
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText">&gt;</span> block                      
                      </td>
                      <td>                        
                        Math                      
                      </td>
                      <td>
                        comprueba si la longitud del valor recuperado es &gt; (mayor que) 0
                      </td>
                    </tr>
                    <tr>
                      <td class="ButtonText">                        
                        length text                      
                      </td>
                      <td>                        
                        Text                      
                      </td>
                      <td>
                        comprueba si la longitud del valor recuperado es mayor que 0
                      </td>
                    </tr>
                    <tr>
                      <td class="ButtonText">                        
                        global response                      
                      </td>
                      <td>                        
                        My Definitions                      
                      </td>
                      <td>
                        esta variable mantiene el valor devuelto desde <span class="ButtonText">GetValue</span>
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText">number</span> (0)                      
                      </td>
                      <td>                        
                        Math                      
                      </td>
                      <td>
                        para comparar con la longitud de la respuesta
                      </td>
                    </tr>
                    <tr>
                      <td>
                        <span class="ButtonText">set MessageTextbox.Text to</span>
                      </td>
                      <td>                        
                        MessageTextbox                      
                      </td>
                      <td>
                        si recuperamos algo, lo coloca en <span class="ButtonText">MessageTextbox</span>
                      </td>
                    </tr>
                    <tr>
                      <td class="ButtonText">                        
                        global response                      
                      </td>
                      <td>                        
                        My Definitions                      
                      </td>
                      <td>
                        esta variable mantiene el valor devuelto desde <span class="ButtonText">GetValue</span>
                      </td>
                    </tr>
                  </tbody>
                </table>
                <p>
                  Los bloques deben quedar así:
                </p>
                <div class="imagecontainer">
                  <img alt="" height="265" src="NoTextWhileDrivingAssets/GetValue.png" width="547">
                </div>
                <h2>
                  Como trabajan los bloques<br>
                </h2>
                <p>
                  Cuando se inicia la aplicación, el evento <span class="ButtonText">Screen1.Initialize</span> es activado. La aplicación llama a la base de datos <span class="ButtonText">TinyDB1.GetValue</span> con la etiqueta (tag) "responseMessage"-- la misma etiqueta usada cuando almacenaste la entrada del usuario anteriormente. El valor resultante se coloca en la variable de respuesta (response).
                </p>
                <p>
                  La variable de respuesta se usa para que el valor devuelto por la base de datos pueda ser comprobado. Si tiene una longitud de 0, entonces no hay una entrada en la base de datos con la etiqueta "responseMessage"-- algo que ocurrirá la primera vez que se use esta aplicación. Pero si el mensaje es mayor que 0, la aplicación sabe que una respuesta ha sido almacenada anteriormente, y el valor devuelto puede ser colocado en <span class="ButtonText">MessageTextBox</span> lo cual podrá ver el usuario y será usado como respuesta en los mensajes enviados.<br>
                  <br>
                </p>
                <blockquote class="testing">
                  <strong>Prueba la aplicación.</strong> Introduce una nueva respuesta en <span class="ButtonText">MessageTextbox</span> y haz clic en <span class="ButtonText">SubmitResponseButton</span>. Entonces reinicia la aplicación haciendo clic en el botón <span class="ButtonText">Restart App</span> en el Editor de bloques. Esto hará que la aplicación se reinicie tal como lo haría cuando el usuario cierra y vuelve a abrir la aplicación mas tarde. ¿Aparece el mensaje personalizado que has introducido?<br>
                </blockquote>
                <h2>
                  No Text While Driving, programa final
                </h2>
                <div class="imagecontainer">
                  <img alt="" height="422" src="NoTextWhileDrivingAssets/finalProg.png" width="940">
                </div>
                <h2>
                  Variaciones
                </h2>
                <p>
                  Una vez que tengas la aplicación No Text While Driving  funcionando, puede que quieras explorar algunas variaciones. Por ejemplo.
                </p>
                <ul>
                  <li>Crea una versión que lea en voz alta los mensajes recibidos. Necesitará usar el componente <span class="ButtonText">TextToSpeech</span>.
                  </li>
                  <li>Crea una versión que permita al usuario crear mensajes personalizados para números en particular.
                  </li>
                  <li>Crea una versión que envíe respuestas personalizadas basándose en la localización del usuario (por ejemplo, Estoy en unan iglesia...)<br>
                  </li>
                </ul>
                <h2>
                  Revisión
                </h2>Estas son algunas de las ideas examinadas en este tutorial:<br>
                <ul>
                  <li>El componente <span class="ButtonText">Texting</span> puede ser usado tanto para enviar mensajes como para procesar los que se reciben.<br>
                  </li>
                  <li>El componente <span class="ButtonText">TinyDB</span> se usa para almacenar información de modo persistente, en la base de datos del teléfono, para que esté disponible cada vez que se inicie la aplicación.<br>
                  </li>
                </ul>
                <h2>
                  Escanea la aplicación de ejemplo para tu teléfono
                </h2>
                <p>
                  Escanea el siguiente código Qr con tu teléfono para instalar y ejecutar la aplicación de ejemplo.
                </p>
                <div class="imagecontainer">
                  <img alt="" src="NoTextWhileDrivingAssets/notextbarcode.png">
                </div>
                <h2>
                  Descarga el código fuente
                </h2>Si te ha gustado trabajar con este ejemplo en App Inventor, descarga el <a href="NoTextWhileDrivingAssets/notextwhiledriving.zip">código fuente</a> a tu computadora, despues abre App Inventor, ve a la página <span class="ButtonText">My Projects</span>, y elige <span class="ButtonText">More Actions | Upload Source</span>.
              </div>
              <blockquote class="notice">
                Google agradece al <a href="http://www.appinventor.org/">Profesor David Wolber</a>, Profesor de Ciencias de la Computación en la Universidad de San Francisco, el desarrollo de este tutorial.
              </blockquote>
            </div>
          </div>
        </div>
        <div class="footer">
          <div class="footer-legal">
            <p>
              <a href="http://creativecommons.org/licenses/by-nc/3.0/es/" rel="license"><img alt="Creative Commons License" class="c4" src="http://i.creativecommons.org/l/by-nc/3.0/88x31.png"></a><br>
              Este trabajo está bajo una licencia <a href="http://creativecommons.org/licenses/by-nc/3.0/es/" rel="license">Creative Commons Attribution-NonCommercial 3.0 Unported License</a>.
            </p>
            <p>
              El trabajo original de Google se ha modificado<br>
              El trabajo modificado se ha traducido del ingles al español<br>
              <a href="../../../about/index.html">Acerca de</a> | <a href="../../../about/privacy.html">Privacidad</a> | <a href="../../../about/termsofservice.html">Condiciones</a>
            </p>
          </div>
          <div class="footer-lastupdate">
            <script type="text/javascript">
if (document.lastModified != '') {
                var m = "Page last updated: " + document.lastModified;
                var p = m.length-8;
                document.writeln("<center>");
                document.write(m.substring(p, 0));
                document.writeln("<\/center>");
              }
            </script>
          </div>
        </div>
      </div>
    </div>
  </body>
</html>

